home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
program
/
fpkpas92.zip
/
SRCRTL.ZIP
/
RTL
/
DOS
/
IBM.PPI
< prev
next >
Wrap
Text File
|
1997-07-01
|
4KB
|
150 lines
{ IBM.PPI }
function DetectVESA:Boolean;
var Result:longint;
begin
Result:=Global_dos_alloc($0200);
Sel:=word(Result);
Seg:=word(Result shr 16);
dregs.RealSP:=0; dregs.RealSS:=0;
dregs.RealES:=Seg; dregs.RealEDI:=0;
dregs.RealEAX:=$4F00; RealIntr($10,dregs);
if isDPMI
then MoveLong(sel,@VGAInfo,256)
else Move(pointer((seg shl 4)+core)^,VGAInfo,256);
global_dos_free(sel);
DetectVesa:=(dregs.RealEAX and $FF=$4F);
isVESA2:=VGAInfo.VESAHiVersion=2;
end;
function GetVESAInfo( Mode : WORD ):Boolean;
var Result:longint;
begin
Result:=Global_dos_alloc($0200);
Sel:=word(Result);
Seg:=word(Result shr 16);
dregs.RealECX:=mode;
dregs.RealSP:=0; dregs.RealSS:=0;
dregs.RealES:=Seg; dregs.RealEDI:=0;
dregs.RealEAX:=$4F01; RealIntr($10,dregs);
if isDPMI
then MoveLong(sel,@VESAInfo,256)
else Move(Pointer((seg shl 4)+core)^,VESAINFO,256);
global_dos_free(sel);
if (dregs.RealEAX and $ff) =$4F then
begin
GetVESAInfo:=true;
BytesPerLine:=VESAInfo.BPL;
case VESAInfo.BitsPerPixel of
8 : BytesPerPixel:=1;
15,16 : BytesPerPixel:=2;
24 : begin
Oh_Kacke('24-Bit Modis nicht implementiert !');
exit;
end;
end;
_maxx:=VESAInfo.XResolution;
_maxy:=VESAInfo.YResolution;
WinSize:=VESAInfo.Winsize*1024;
WinLoMask:=WinSize-1;
case VESAInfo.WinSize of
64 : WinShift:=16; { x div 65536 = x shr 16 }
32 : WinShift:=15; { x div 32768 = x shr 15 }
16 : WinShift:=14; { ... }
8 : WinShift:=13;
4 : WinShift:=12;
2 : WinShift:=11;
1 : WinShift:=10;
end;
Granularity:=VESAInfo.WinGranularity;
Granular:=VESAInfo.WinSize div Granularity;
case Granular of
32 : GranShift:=5;
16 : GranShift:=4;
8 : GranShift:=3;
4 : GranShift:=2;
2 : GranShift:=1;
1 : GranShift:=0;
end;
{ set selector for writing }
if isDPMI then begin
set_segment_base_address(seg_write,$A000 shl 4);
set_segment_limit(seg_write,$FFFF);
seg_read:=seg_write;
end;
SwitchCS:=hi(VESAInfo.RealWinFuncPtr);
SwitchIP:=lo(VESAInfo.RealWinFuncPtr);
end else GetVESAInfo:=false;
end;
function SetVESAMode(Mode:WORD):Boolean;
begin
dregs.RealEBX:=Mode;
dregs.RealSP:=0; dregs.RealSS:=0;
dregs.RealEAX:=$4F02; RealIntr($10,dregs);
if (dregs.RealEAX and $FF) <> $4F then begin
writeln('Coudnt initialize VESAMode ',HexStr(mode,4));
SetVESAMode:=false;
end
else SetVESAMode:=true;
end;
function GetVESAMode:Integer;
begin
dregs.RealSP:=0; dregs.RealSS:=0;
dregs.RealEAX:=$4F03; RealIntr($10,dregs);
GetVESAMode:=lo(dregs.RealEBX);
end;
procedure InitVESA;
var RM:Word;
begin
isDPMI:=false;
rm:=get_run_mode;
case rm of
0 : writeln('unknown mode');
1 : writeln('RAW mode');
2 : writeln('XMS detected');
3 : writeln('VCPI detected');
4 : begin writeln('DPMI detected');
isDPMI:=true;
end;
end; { case }
if isDPMI then begin
seg_write:=allocate_ldt_descriptors(1);
seg_read:=allocate_ldt_descriptors(1);
end else begin
seg_write:=get_DS;
seg_read:=get_DS;
end;
end;
procedure DoneVESA;
begin
if isDPMI then begin
free_ldt_descriptor(seg_read);
free_ldt_descriptor(seg_write);
end;
end;
procedure Switchbank(bank:longint);
begin
asm
leal _DREGS,%edi
movl bank,%eax
movzbl _GRANSHIFT,%ecx
shll %cl,%eax
movl %eax,20(%edi) // RealEDX
movw _SWITCHCS,%ax
movw %ax,44(%edi) // RealCS
movw _SWITCHIP,%ax // RealIP
movw %ax,42(%edi)
xorl %ecx,%ecx
movl %ecx,46(%edi) // RealSS,RealSP
movl %ecx,16(%edi) // RealEBX }
movw $0x0301,%ax
int $0x31
end;
end;